跳到主要内容

问:为什么通过 impacket-smbclient 可以写入 ADMIN$ 共享,而通过 smbclient 客户端却无法连接?二者面向的是同一个目标,使用的账户都是 administrator。

impacket-smbclient 可以写入 ADMIN$,但 smbclient 却无法连接,虽然二者面对同一个目标使用同一个 Administrator 账号,是因为两者的 SMB 实现对权限、认证令牌、UAC 的处理方式不同。

来,我们深入讲讲原因👇


🔍 核心区别在于:如何使用管理员权限连接远程共享

impacket-smbclient:绕过了 Windows 的 UAC 限制

  • 它使用了 RPC 和更底层的 SMB 框架(基于 Impacket 库),模拟了 远程命令执行上下文,并使用管理员权限直接调用 Windows 接口;
  • 它常常以 "服务执行"(SERVICE EXEC)或 WMI 的方式,在系统上下文运行命令;
  • 所以它是以内核级权限执行,不受 UAC token 过滤限制;
  • 它绕过了 Windows 网络访问的 token 限制(默认的网络登录不会给完整管理员权限,即使是 Administrator)。

smbclient:受到了 UAC 网络访问的限制

  • 它是个传统的 SMB 客户端,行为就像从另一台电脑访问共享;
  • 即使你使用 Administrator,如果目标机器启用了 UAC 网络访问限制,你登录后获得的并不是完全的 admin token(即使本地是管理员,网络访问时是“受限管理员”);
  • 所以你访问 ADMIN$ 可能会看到它“存在”,甚至列出内容,但会拒绝写入或连接。

🧱 Windows 中的一个“坑”:UAC 网络限制

Windows 从 Vista 开始引入了这个“安全机制”:

当使用本地 Administrator 账户通过网络访问 Windows 时,默认不会获得完全管理员权限。

这就是为什么 smbclient 失败,而 impacket-smbclient 成功的核心原因。


✅ 解决方案(让 smbclient 能连)

你可以在目标 Windows 上设置一项注册表键来关闭这个限制

🚀 修改注册表:

在目标 Windows 上执行:

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

然后重启计算机或 Server 服务。

这个设置允许使用本地管理员账号从网络访问时获得完整的管理员权限。


🛠️ 补充建议

如果你经常做这类操作,可以记住以下几点:

  • smbclient 是“网络共享级别”的访问,不一定能做到系统级的操作;
  • impacket 是“系统命令执行级别”的工具,权限更深;
  • 如果你只是为了上传文件、远程执行命令,smbexec, psexec, wmiexec 这些 Impacket 工具会更加稳定;
  • 想用 smbclient 来访问 ADMIN$,一定要搞定 UAC 远程限制。